什么时候需要跨会话投递

OpenClaw 里每个 session(会话)都有独立模型上下文。日常我们在一个会话里干活,结果天然留在原地。但有三类场景,结果必须"跨出去":

  • 定时任务产出要回写给某个常驻会话:比如凌晨跑的内容工厂产出,要落到主会话的可见历史里,而不是只写在服务器文件上。
  • 把子智能体结果回投给父会话:拆任务时,子 session 跑完,父会话需要拿到结论继续。
  • 主动推送结果到指定会话:不等人来问,跑完直接送过去。

核心工具就是 sessions_send:按 sessionKey 或 label 找到目标会话,把消息发过去,可选 watch 等回复。

sessions_send 的基本参数

{
  "message": "这里是投递的正文",
  "sessionKey": "agent:main:abc123",
  "timeoutSeconds": 0,
  "watch": false
}

| 参数 | 作用 | 说明 |

|------|------|------|

| message | 投递文本 | 必填,就是要发过去的内容 |

| sessionKey | 目标会话标识 | 与 label 二选一,sessionKey 优先 |

| label | 目标会话标签 | 模糊匹配标签名,找不到再回退 sessionKey |

| timeoutSeconds | 等待回复秒数 | 0 表示不等,发了就走 |

| watch | 是否监听后续变更 | true 时对方后续改动会通知回来 |

关键认知:sessionKey 是稳定标识,命中率高;label 可读但可能冲突,先确认侧栏里目标会话的精确标签再投。

实操一:把定时任务结果回写主会话

最常见用法。定时任务跑在隔离上下文,产出是文件;要让 Z 在微信里看到,就用 sessions_send 把摘要投到主会话。

# 伪代码示意:在 cron 任务的 agentTurn payload 末尾追加一步
import subprocess, json

result = {
    "title": "OpenClaw 每日发文-凌晨03:00",
    "url": "https://zyker.cn/archives/xxx/",
    "word_count": 1820,
    "has_qr": True,
}

msg = "今日已发布:《%s》\nURL: %s\n字数: %d\n含二维码: %s" % (
    result["title"], result["url"], result["word_count"], result["has_qr"]
)

# 找到主会话的 sessionKey(从 sessions_list 取),投递
subprocess.run([
    "openclaw", "sessions", "send",
    "--session", "agent:main:<key>",
    "--message", msg
])

注意 timeoutSeconds=0(默认即不等):定时任务不需要阻塞等人回。投递成功后,主会话历史里会出现这条消息,微信侧也会收到。

实操二:父会话等待子会话回投结果

派生子智能体做耗时活(如长构建、批量抓取),父会话用 watch:true 等它。

{
  "action": "send",
  "sessionKey": "agent:sub:build-2026",
  "message": "开始构建,完成后把产物路径发回来",
  "watch": true,
  "timeoutSeconds": 600
}

返回里 targetDisposition 会是 "queued" 或 "steered",表示目标已接收;对方回复后,父会话收到一条带结论的新消息,可继续后续步骤。

实操三:投递到外部会话(conversations_send 的区别)

sessions_send 走的是 OpenClaw 本机 session 体系。如果目标是外部聊天地址(如某个微信群、Telegram 会话),要用 conversations_send + conversations_list 拿到的 conversationRef:

{
  "action": "send",
  "conversationRef": "conv_a1b2c3d4e5f6...",
  "message": "今日内容工厂产出已发布"
}

区别一句话:sessions_send 投给本机 session,conversations_send 投给外部频道会话。别混用——投错目标会失败或发到不该发的地方。

三个容易踩的坑

  • sessionKey 写错:发之前先用 sessions_list 核对 sessionKey,别凭记忆拼。投到不存在的 key 会报错而不是静默丢弃。
  • 在隔离 cron 里用 watch 又设长超时:隔离任务本来就是 detached,设 watch:true + 大 timeoutSeconds 会一直挂着。普通回写用 watch:false。
  • 正文带敏感信息:投递是跨上下文的动作,正文别塞密钥、token。密钥走 secrets,不进消息体。

小结

跨会话投递的本质就三步:确认目标(sessions_list / conversations_list)→ 投递(sessions_send / conversations_send)→ 按需等待(watch/timeoutSeconds)。掌握它,定时任务、子智能体、外部推送的结果回收就都闭环了。


扫码关注公众号,获取更多 OpenClaw 实操技巧:

公众号二维码